/* Пример программы для доступа к DS2433 */

/* Микроконтроллер  AT90S2313, шина 1-Wire DS2433
   подключена к 0 биту PORTB (рис. 346) */

#include <90s2313.h> 	// подключаем  заголовочный файл используемого 
					// микроконтроллера AVR

/* Перед подключением файла ds2433.h, объявим порт и бит порта, 
   используемые для подключения шины 1-Wire */

/* Шина 1-Wire подключена к 0 биту PORTB микроконтроллера AT90S2313 
   Адрес порта находим в файле 90s2313.h в строке: sfrb PORTB=0x18; */
#asm
.equ __w1_port=0x18
.equ __w1_bit=0
#endasm

/* Теперь можно подключать Функции EEPROM DS2433 */ 
#include <ds2433.h>

/* определим максимальное количество устройств DS2433, 
   которое может присутствовать на шине 1-Wire */ 
#define max_number 8

/* распределим пространство SRAM для ROM кода устройств 
   DS2433 и бита статуса
   Для каждого устройства используется 9 байтов (смотри описание функции  
   w1_search в главе Функции Протокола 1-Wire, стр. 414), но только первые
   8 байтов содержат ROM код и CRC (контрольную сумму) */
   
unsigned char cod_rom [max_number][9];

		unsigned char data_write[]="ABC";	// Объявляем и определим строку								// data_write, значение 
								// которой будем записывать
								// во все EEPROM DS2433  
		unsigned char data_read [max_number][2]; // Объявляем символьный массив, 
									// в который будем считывать 
									// значения изо всех EEPROM 									// DS2433  	
		#define address_0 1		// Определим (произвольно) начальный 
							// адрес памяти EEPROM DS2433, начиная с 
							// которого будем осуществлять операции 
							// записи и чтения   

/* Основная функция программы */ 

void main(void) 
{
		unsigned char i; 			// Объявляем индексную переменную i
		unsigned char number_DS2433; 	// Объявляем переменную number_DS2433,
							// где будет храниться количество
							// устройств DS2433, присутствующих
							// на шине 1-Wire	

		/* инициализируем DS2433 устройства на шине 1-Wire функцией w1_init */
	   
		if(w1_init())
		/* Следующие операторы в фигурных скобках будут выполняться, если
	   	   функция w1_init вернет значение, не равное 0, т.е., если на шине
	   	   1-Wire присутствует ходя бы одно устройство DS2433 
   (см. "Функции Протокола 1-Wire", стр. 414) */
		{
			/* определим, сколько устройств DS2433 подключено к шине
 	   1-Wire, и сохраним их ROM коды в массиве cod_rom 
		   	   Для этого вызываем функцию w1_search с командой Search
		   	   ROM (Поиск ROM кодов) (код - F0h) 
		   	   (см. "Функции Протокола 1-Wire", стр. 414) */
 
			number_DS2433=w1_search(0xf0,cod_rom); 	 
			
			/* теперь в переменной number_DS2433 хранится количество
		   	   устройств DS2433, присутствующих на шине 
		   	   1-Wire, а в массиве cod_rom их ROM коды */
	
				/* запишем значение строки data_write в каждую
				   EEPROM DS2433 */
				for (i=0;i<number_DS2433;i++)
				{ 					// открывающая скобка оператора for
					/* В функции ds2433_write_block: поочередно выбираем
					   ROM код каждого устройства (i) из массива cod_rom. 
   В качестве указателя	 подставляем адрес первого байта	   i-го ROM кода(&cod_rom[i][0]);					   записываемая строка - data_write. В качестве указателя
					   подставляем адрес первого элемента этой строки
   (&data_write[0]);					   
 				   запись начинаем с адреса address_0;
					   значение size=3, т.к. в этой строке 3 байта */

				ds2433_write_block(&cod_rom[i][0],&data_write[0],address_0,3);
				}			// закрывающая скобка оператора for

				/* считаем записанное значение из каждой DS2433 
				   в массив data_read */
				for (i=0;i<number_DS2433;i++)
				{ 			// открывающая скобка оператора for
					/* В функции ds2433_read_block: поочередно выбираем
					   ROM код каждого устройства (i) из массива cod_rom. 
   В качестве указателя подставляем адрес первого байта
					   i-го ROM кода (&cod_rom[i][0]); 
					   считанное значение записываем в соответствующую
					   переменную data_read[i][2], заполняя массив data_read.
					   В качестве указателя подставляем адрес первого 
					   элемента в строке(&data_read[i][0]);  				   	   	   чтение начинаем с адреса address_0;
					   значение size=3, т.к. в считываемой строке 3 байта */
					   
				ds2433_read_block(&cod_rom[i,0],&data_read[i][0],address_0,3);
				}			// закрывающая скобка оператора for
			};				// закрывающая скобка оператора if 
			while (1); 			// заканчиваем программу бесконечным циклом
		}
